package se.stabby.undersok.model;

import com.google.common.base.Preconditions;

import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * User: per.segersten
 * Date: 2014-06-04
 */
public class KategoriTolkare implements Tolkare {

    private final Map<Character, List<String>> kategorier;
    private final Map<FrågaId, List<Character>> svarskategorier;
    private final Random random = new Random();

    public KategoriTolkare(Map<Character, List<String>> kategorier, Map<FrågaId, List<Character>> svarskategorier) {
        this.kategorier = kategorier;
        this.svarskategorier = svarskategorier;
    }

    @Override
    public Resultat tolka(PågåendeUndersökning uppdateradUndersökning) {
        Preconditions.checkArgument(uppdateradUndersökning.ärKlar());

        Map<Character, AtomicInteger> fördelning = new HashMap<Character, AtomicInteger>();
        for (Character c : kategorier.keySet()) {
            fördelning.put(c, new AtomicInteger(0));
        }
        uppdateradUndersökning.svaren.forEach(s -> {
            List<Character> key = svarskategorier.get(s.fråga.id);
            Character kategori = key.get(s.val);
            fördelning.get(kategori).getAndIncrement();
        });

        Character vinnandeKategori = fördelning.entrySet().stream().max(KategoriTolkare::compare).get().getKey();
        List<String> analysMeningar = new ArrayList<>(kategorier.get(vinnandeKategori));
        String result = analysMeningar.remove(0);
        for(int i=0;i<2 && analysMeningar.size()>0;i++) {
            result += " " + analysMeningar.remove(random.nextInt(analysMeningar.size()));
        }
        return new Resultat(uppdateradUndersökning.id, uppdateradUndersökning.undersökningId, result);
    }

    private static int compare(Map.Entry<Character, AtomicInteger> o1, Map.Entry<Character, AtomicInteger> o2) {
        return o1.getValue().get() - o2.getValue().get();
    }
}
